package com.gm.wj.controller;

import com.gm.wj.entity.SysCourse;
import com.gm.wj.result.Result;
import com.gm.wj.result.ResultFactory;
import com.gm.wj.service.SysCourseService;
import com.gm.wj.util.SysLoging;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * @program: wj
 * @description: 课程管理
 * @author: Huang_shengjun
 * @create: 2020-08-31 15:19
 **/
@Log4j2
@RestController
@Api(tags = "课程管理相关接口")
public class SysCourseController {

    @Autowired
    SysCourseService sysCourseService;

    // 添加/修改
    @PostMapping("api/admin/content/course")
    @SysLoging("添加课程信息") //根据SysLoging的注解信息，进行方法的注释
    @ApiOperation("添加课程信息的接口")
    public Result saveCourse(@RequestBody @Valid SysCourse sysCourse, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return ResultFactory.buildFailResult(bindingResult.getAllErrors().get(0).getDefaultMessage());
        }
        try{
            sysCourseService.addOrUpdate(sysCourse);
            return ResultFactory.buildSuccessResult("保存成功",null);
        } catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }

    }

    // 列表
    @PostMapping("/api/course/{size}/{page}")
    @ApiOperation("查询课程列表信息的接口")
    @SysLoging("查询课程列表信息") //根据SysLoging的注解信息，进行方法的注释
    public Result listCourse(@PathVariable("size") int size, @PathVariable("page") int page,String queryKey1,String queryKey2, String queryKey3) {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.list(page - 1, size, queryKey1,queryKey2,queryKey3));
        } catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }

    }

    // 更新启用状态
    @PutMapping("/api/admin/course/status")
    @ApiOperation("更新课程状态信息的接口")
    @SysLoging("更新课程状态信息") //根据SysLoging的注解信息，进行方法的注释
    public Result updateStatus(@RequestBody SysCourse sysCourse) {
        try {
            if (sysCourse.isDisplay()) {
                sysCourseService.updateDisplay(sysCourse);
                return ResultFactory.buildSuccessResult("状态更新成功",null);
            }
            else {
                if (sysCourseService.findByDisplay()) {
                    sysCourseService.updateDisplay(sysCourse);
                    return ResultFactory.buildSuccessResult("状态更新成功",null);
                } else {
                    return ResultFactory.buildFailResult("课程启用状态将少于 3 个，请检查后再操作");
                }
            }
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 根据id查询
    @GetMapping("/api/course/{id}")
    @ApiOperation("根据id查询课程信息的接口")
    @SysLoging("根据id查询课程信息") //根据SysLoging的注解信息，进行方法的注释
    public Result getOneCourse(@PathVariable("id") int id) {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.findById(id));
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 删除
    @DeleteMapping("/api/admin/content/course/{id}")
    @ApiOperation("删除课程信息的接口")
    @SysLoging("删除课程信息")
    public Result deleteCourse(@PathVariable("id") int id) {
        try{
            sysCourseService.delete(id);
            return ResultFactory.buildSuccessResult("删除成功",null);
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }


    // 根据条件查询列表
    @PostMapping("/api/admin/course/findByQueryKey")
    @ApiOperation("根据条件查询课程列表的接口")
    @SysLoging("根据条件查询课程列表")
    public Result listByQueryKey(String queryKey1,String queryKey2, String queryKey3) {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.listByQueryKey(queryKey1,queryKey2,queryKey3));
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 首页
    @ApiOperation("首页-课程信息的接口")
    @PostMapping("/api/course/findCourseByDisplay")
    public Result findCourseByDisplay() {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.list());
        } catch (Exception e){
            e.printStackTrace();
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }

    }

    @GetMapping("/api/course/{cid}/courses")
    @SysLoging("首页某个目录下课程列表信息")
    public Result listByCategory(@PathVariable("cid") int cid) {
        try{
            if (0 != cid) {
                return ResultFactory.buildSuccessResult("查询成功",sysCourseService.listByCategory(cid));
            } else {
                return ResultFactory.buildSuccessResult("查询成功",sysCourseService.list());
            }
        } catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    @GetMapping("/api/search/course")
    @SysLoging("首页根据关键字查询课程信息")
    public Result searchResult(@RequestParam("keywords") String keywords) {
        try{
            if ("".equals(keywords)) {
                return ResultFactory.buildSuccessResult("查询成功",sysCourseService.list());
            } else {
                return ResultFactory.buildSuccessResult("查询成功",sysCourseService.Search(keywords));
            }
        } catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 列表
    @PostMapping("/api/admin/course/myCourse")
    @ApiOperation("查询我的课程列表信息的接口")
    @SysLoging("查询我的课程列表信息") //根据SysLoging的注解信息，进行方法的注释
    public Result listCourseByUsername() {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.listByMy());
        } catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 根据courseId查询
    @GetMapping("/api/admin/courseByCourseId/{courseId}")
    @ApiOperation("根据id查询课程信息的接口")
    @SysLoging("根据id查询课程信息") //根据SysLoging的注解信息，进行方法的注释
    public Result getOneCourseByCourseId(@PathVariable("courseId") String courseId) {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.findByCourseId(courseId));
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    // 根据courseId查询课程下的报名学生
    @GetMapping("/api/admin/getStuListByCourseId/{courseId}")
    @ApiOperation("根据id查询课程信息的接口")
    @SysLoging("根据id查询课程信息") //根据SysLoging的注解信息，进行方法的注释
    public Result getStuListByCourseId(@PathVariable("courseId") String courseId) {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.getStuListByCourseId(courseId));
        }catch (Exception e){
            e.printStackTrace(); // 在控制台打印出异常种类，错误信息和出错位置等
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }
    }

    @ApiOperation("首页-课程信息类别的接口")
    @GetMapping("/api/course/courseTypeList")
    public Result findcourseTypeList() {
        try{
            return ResultFactory.buildSuccessResult("查询成功",sysCourseService.courseTypeList());
        } catch (Exception e){
            e.printStackTrace();
            return ResultFactory.buildFailResult("服务器出错了，请联系管理员。错误信息：" + e.getMessage());
        }

    }

}
